/**
 * Node事件循环阶段
 * 事件循环是一个桥梁，例如IO操作，定时器操作等不会放在js线程主线程，而是放在node进程开启的其他线程
 * 原因：如果都放在主线程会造成严重阻塞，js是单线程运行的，所以会有很多其他线程来辅助运行
 * 当相应功能线程完成操作后，会将结果和回调函数放到事件队列中，逐个取出归还到js线程进行执行
 * Node的任务队列比浏览器复杂的多，一次事件循环Tick分成很多个阶段
 * ① 定时器（Timers）--本阶段执行已经被setTimeout()和setInterval()的调度回调函数
 * ② 待定回调(Pending Callback) --对某些操作系统（如TCP错误类型）执行回调，比如TCP连接时接收到ECONNREFUSED
 * ③ idle,prepare --仅系统内部使用
 * ④ 轮询(Poll) --检索新的IO事件，执行与IO相关的回调
 * ⑤ 检测(check) --setImmediate()回调函数在这执行
 * ⑥ 关闭的回调函数 --一些关闭的回调函数，如socket.on('close',...)
 * 面试常用的是①⑤
 *
 * 宏任务(macrotask): setTimeout,setInterval,IO事件,setImmediate,close事件
 * 微任务(microtask): Promise的then回调,process.nextTick,queueMicrotask
 *
 * Node的事件循环不只是微任务队列和宏任务队列
 * 微任务队列：
 *       next tick queue: process.nextTick
 *       other queue: Promise-then,queueMicrotask
 * 宏任务队列：
 *       timer queue: setTimeout,setInterval
 *       poll queue: IO
 *       check queue: setImmediate
 *       close queue: close
 */
